package tour.board.controller;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import tour.board.service.EpBoardService;
import tour.board.to.EpBoard;
import tour.board.to.ReEpBoard;
import tour.board.to.RecommendTO;
import tour.board.to.UpFile;
import board.util.Utilities;






@Controller
@RequestMapping("/ep_board")
public class EpBoardController {

	@Autowired
	private EpBoardService epBoardService;
	
	private String imgDir = "C:\\day_class\\apache-tomcat-6.0.37\\webapps\\tour\\ep_img";
	
	public void setBoardService(EpBoardService epBoardService) {
		this.epBoardService = epBoardService;
	}
	
	/**
	 * 새글 입력 폼 이동 처리 handler메소드
	 * @return String url
	 */
	@RequestMapping("/write_form.do")
	public String writeForm(){
		return "write_form.jsp";
	}
	
	@RequestMapping("/b.do")
	public String bbb(ModelMap model) throws Exception{
		ArrayList<EpBoard> list = epBoardService.getBoardAllList();
		model.addAttribute("bo1", list);
		return "/b.jsp";
	}

	/**
	 * 새글 등록 처리 handler 메소드
	 * @param board : Board -  client가 전송한 새글 정보 - writer, title, content 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/writeContent.do")
	public ModelAndView writeContent(EpBoard epBoard , UpFile upFile)throws IllegalStateException, IOException{
		ModelAndView mv = null;
		MultipartFile mf = upFile.getSrc();
		String s = mf.getOriginalFilename();
		//2. Business Logic - Model(Business Service)로 요청
		try {
			mf.transferTo(new File(imgDir,s));
			EpBoard b =new EpBoard(epBoard.getTitle(),epBoard.getWriter(),epBoard.getContent(),s);
			epBoardService.writeContent(b);
			mv = new ModelAndView("redirect:getContent.do?no="+b.getNo());
		} catch (SQLException e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp", "error_message", "글등록 중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	/**
	 * 글 목록 조회 처리 handler 메소드
	 * @param page String - 보고자 하는 list 페이지 번호
	 * @param model ModelMap - list.jsp(목록페이지) 로 전송할 값을 저장할 객체
	 * @return String - list.jsp로 이동 처리
	 * @throws Exception
	 */
	@RequestMapping("/list.do")
	public String list(@RequestParam(required=false, defaultValue="1")String page, ModelMap model) throws Exception{
		
		String url = null;
		//2. Business Logic 호출 ->model		
		try {
			//page=  로 넘어온 경우(위 @RequestParam 설정은 page 요청파라미터 이름으로 넘어온 것이 없는 경우이다.
			if(page.equals("")){
				page="1";
			}
			int pageNo = Integer.parseInt(page);
			Map map = epBoardService.getBoardListByPage(pageNo);
			model.addAllAttributes(map);
			url = "list.jsp";
			
		} catch (SQLException e) {
			e.printStackTrace();
			url = "error.jsp";
			model.addAttribute("error_message", "글목록 조회도중 오류 발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 한개의 글(게시물)을 조회하는 handler 메소드
	 * 
	 * @param no int - 조회하고자 하는 글번호
	 * @param map ModelMap - 조회한 글 데이터를 저장할 ModelMap
	 * @return String - show_content.jsp 로 이동
	 */
	@RequestMapping("/getContent.do")
	public String getContent(int no, ModelMap map){
		String url = null;
		try{
			//2. Business Logic 요청 - Model
			EpBoard epBoard = epBoardService.getContentByNO(no);
			ArrayList list = epBoardService.getReplyByNo(no);
			map.addAttribute("re", list);
			map.addAttribute("board", epBoard);
			url = "show_content.jsp"; 
		}catch(Exception e){
			e.printStackTrace();
			map.addAttribute("error_message", "글 조회도중 오류 발생 : "+e.getMessage());
			url = "error.jsp";
		}	
		return url;
	}
	/**
	 * 수정폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 수정할 글 번호. 이 번호의 글을 조회해서 응답처리한다.
	 * @param map : 수정할 글 데이터를 View에 전송하기 위한 ModelMap
	 * @return String :  정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/modifyForm.do")
	public String modifyForm(int no, ModelMap map){
		String url = null;
		try{
			//2. B.L 처리
			EpBoard epBoard = epBoardService.getContentByNoForForm(no);
			url = "modify_form.jsp";
			map.addAttribute("board", epBoard);
		}catch(Exception e){
			e.printStackTrace();
			url = "error.jsp";
			map.addAttribute("error_message", "수정할 글 조회도중 오류발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 클라이언트가 수정한 글을 처리하기 위한 Handler 메소드
	 * 
	 * @param board : Board -  client가 전송한 게시물 수정 정보 - no, writer, title, content, viewcount, page번호 가 요청파라미터로 전송됨
	 * @return ModelAndView : 정상
	 */
	@RequestMapping("/modifyContent.do")
	public ModelAndView modifyContent(EpBoard epBoard) {
		ModelAndView mv = null;
		try {			
			//2. B.L 요청
			epBoardService.modifyContent(epBoard);
			mv = new ModelAndView("redirect:getContent.do?no="+epBoard.getNo());
		} catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("error.jsp","error_message", "수정처리중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 글 삭제 처리 handler 메소드
	 * @param no : int - 삭제할 글 번호
	 * @return ModelAndView - 정상흐름 : list.do (목록으로 이동), 예외흐름 : error.jsp
	 */
	@RequestMapping("/deleteContent.do")
	public ModelAndView deleteContent(int no){
		System.out.println("no" + no);
		ModelAndView mv = null;
		try {
			//2. BL
			epBoardService.deleteContentByNO(no);
			mv = new ModelAndView("list.do");
			//mv = list(request, response);
		}catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("/error.jsp","error_message", "삭제도중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	/**
	 * 답변 입력 폼 으로 이동을 처리하는 handler 메소드
	 * @param no : int - 답변하고자 하는 원본글의 번호. 답변 폼으로 원본글의 데이터를 보낸다.
	 * @return
	 */
	@RequestMapping("/replyForm.do")
	public String replyForm(int no, ModelMap map){
		String url = null;
		try {
			//1. 요청 파라미터 조회 - no
			EpBoard epboard = epBoardService.getContentByNoForForm(no);
			url = "reply_form.jsp";
			map.addAttribute("board", epboard);
		}catch (SQLException e) {
			e.printStackTrace();
			url = "error.jsp.jsp";
			map.addAttribute("error_message", "답변할 원본글 조회도중 오류 발생 : "+e.getMessage());
		}
		return url;
	}
	/**
	 * 클라이언트가 전송한 답변 글을 등록하는 handler 메소드
	 * @param board : Board - client가 전송한 답변 게시물 정보 - writer, title, content, refamily, restep, relevel, page번호 가 요청파라미터로 전송됨
	 * @param page : 원본글이 위치했던 page (처리후 목록 페이지 이동시 원본글이 있던 페이지로 이동하기 위해)
	 * @return ModelAndView - 정상흐름 - redirect 방식으로 getContent.do , 예외흐름 - error.jsp 로 이동
	 */
	@RequestMapping("/replyContent.do")
	public ModelAndView replyContent(EpBoard epBoard,  @RequestParam(required=false, defaultValue="1") String page){
		ModelAndView mv = null;
		try{
			if(page.equals("")){
				page="1";
			}
			epBoardService.replyContent(epBoard);
			//멱등처리
			mv = new ModelAndView("redirect:getContent.do?no="+epBoard.getNo()+"&page="+page);
		}catch (Exception e) {
			e.printStackTrace();
			mv = new ModelAndView("/error.jsp", "error_message", "답변 처리 중 오류 발생 : "+e.getMessage());
		}
		return mv;
	}
	
	@RequestMapping("/reply.do")
	@ResponseBody
	public ArrayList address(int num , String writer , String reply) throws SQLException{
		epBoardService.addReply(new ReEpBoard(num, writer, reply, Utilities.getNow()));
		ArrayList list = epBoardService.getReplyByNo(num);
		return  list;
	}
	
	//추천
	@RequestMapping("/recommend.do")
	@ResponseBody
	public ArrayList recommend(String id, String boardName, int boardNo ) throws Exception{
		
		
		RecommendTO rto = new RecommendTO(id, boardName, boardNo);
		
		String board = epBoardService.recommend(rto);
		ArrayList list = new ArrayList();
			
			if(board==null){
				epBoardService.updateCommendCount(boardNo);
				list.add("추천됨");
				epBoardService.insertRecommendInfo(rto);
			}else{
				list.add("이미 추천하였습니다.");
			}
		return list;
	}
	
	@RequestMapping("/find.do")
	public String find(String finds,String find,ModelMap map){
		if(finds.equals("제목")){
			ArrayList list = epBoardService.findTitle(find);
			map.addAttribute("list",list);

		}else{
			ArrayList list = epBoardService.findWriter(find);
			map.addAttribute("list",list);
		}
		return "/ep_board/list.jsp";
	}
}
